package 关键字;

import java.util.concurrent.TimeUnit;

public class Volatile {

    /**
     * 不加volatile修饰的flag，线程1和线程2是永远无法感知到flag的修改的
     * 原理是：cpu会缓存住一些数据，当线程1修改时没刷新回内存，线程2会一直从缓存中读取，所以线程2永远无法感知到flag的修改
     * 需要用volatile 修饰flag，保证每次读取flag都是从内存中读取，而不是从缓存中读取
     */
    static volatile int flag = 0;

    public static void main(String[] args) {
        new Thread(() -> {
            int localFlag = flag;
            while (true) {
                if (localFlag != flag) {
                    System.out.println("读取到了修改后的标志位：" + flag);
                    localFlag = flag;
                }
            }
        }).start();
        new Thread(() -> {
            int localFlag = flag;
            while (true) {
                try{
                    TimeUnit.SECONDS.sleep(1);

                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("标志位被修改为了：" + ++localFlag);
                flag = localFlag;
            }
        }).start();

    }
}
